// 你正在和你的朋友玩 猜数字（Bulls and Cows）游戏：你写下一个数字让你的朋友猜。每次他猜测后，你给他一个提示，告诉他有多少位数字和确切位置都猜对了（称为“Bulls”, 公牛），有多少位数字猜对了但是位置不对（称为“Cows”, 奶牛）。你的朋友将会根据提示继续猜，直到猜出秘密数字。

// 请写出一个根据秘密数字和朋友的猜测数返回提示的函数，用 A 表示公牛，用 B 表示奶牛。

// 请注意秘密数字和朋友的猜测数都可能含有重复数字。

// 示例 1:

// 输入: secret = "1807", guess = "7810"

// 输出: "1A3B"

// 解释: 1 公牛和 3 奶牛。公牛是 8，奶牛是 0, 1 和 7。
// 示例 2:

// 输入: secret = "1123", guess = "0111"

// 输出: "1A1B"

// 解释: 朋友猜测数中的第一个 1 是公牛，第二个或第三个 1 可被视为奶牛。
// 说明: 你可以假设秘密数字和朋友的猜测数都只包含数字，并且它们的长度永远相等。

#include <string>
#include <vector>

using std::vector;
using std::string;
using std::to_string;

class Solution1 {
public:
    string getHint(string secret, string guess) {
        vector<int> hash(256, 0);
        int bulls{0}; // num of bulls
        int cows{0}; // num of cows
        int n = secret.size();
        for (int i{0}; i < n; ++i) {
            if (secret[i] == guess[i]) ++bulls;
            else ++hash[secret[i]];
        }
        for (int i{0}; i < n; ++i) {
            if (secret[i] != guess[i] && hash[guess[i]]) {
                ++cows;
                --hash[guess[i]];
            }
        }
        return to_string(bulls) + "A" + to_string(cows) + "B";
    }
};

class Solution {
public:
    string getHint(string secret, string guess) {
        vector<int> hash(256, 0);
        int bulls{0};
        int cows{0};
        int n = secret.size();
        for (int i{0}; i < n; ++i) {
            if (secret[i] == guess[i]) ++bulls;
            else {
                // 如果secret当前位置数字的映射值小于0，则表示其在guess中出现过，cows自增1，然后映射值加1，
                if (hash[secret[i]]++ < 0) ++cows;
                // 如果guess当前位置的数字的映射值大于0，则表示其在secret中出现过，cows自增1，然后映射值减1，
                if (hash[guess[i]]-- > 0) ++cows;
            }
        }
        return to_string(bulls) + "A" + to_string(cows) + "B";
    }
};

class Solution {
public:
    string getHint(string secret, string guess) {
        int n = secret.size(); // secret.length == guess.length
        int numA{0};
        int numB{0};
        vector<int> hashMapSecret(10, 0);
        vector<int> hashMapGuess(10, 0);
        for (int i{0}; i < n; ++i) {
            if (secret[i] == guess[i]) {
                ++numA;
            } else {
                ++hashMapSecret[secret[i] - '0'];
                ++hashMapGuess[guess[i] - '0'];
            }
        }
        for (int i{0}; i <= 9; ++i) {
            numB += min(hashMapSecret[i], hashMapGuess[i]);
        }
        string res = to_string(numA) + "A" + to_string(numB) + "B";
        return res;
    }
};